<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>refl-cpp: Changelog</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
  $(document).ready(function() { init_search(); });
/* @license-end */
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">refl-cpp
   </div>
  </td>
   <td>        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
</td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('md__c_h_a_n_g_e_l_o_g.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="PageDoc"><div class="header">
  <div class="headertitle">
<div class="title">Changelog </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h2><a class="anchor" id="autotoc_md1"></a>
v0.12.4</h2>
<ul>
<li><code>runtime::invoke</code> functions with void return type <a href="https://github.com/veselink1/refl-cpp/pull/68">#68</a> (thanks @ohanar)</li>
<li>Faster <code>trait::get_t</code> - speeds up compilation for large classes <a href="https://github.com/veselink1/refl-cpp/pull/72">#72</a>, see discussion in <a href="https://github.com/veselink1/refl-cpp/issues/71">#71</a></li>
<li>Fix for Apple Clang and libc++ <a href="https://github.com/veselink1/refl-cpp/pull/76">#76</a></li>
</ul>
<h2><a class="anchor" id="autotoc_md2"></a>
v0.12.3</h2>
<ul>
<li>Fixed inverted order of <code><a class="el" href="namespacerefl_1_1util.html#a097549e41bac7745db61442f94135c41" title="Filters the list according to a constexpr predicate.">refl::util::filter()</a></code> and its users <a href="https://github.com/veselink1/refl-cpp/issues/65">#65</a> (thanks @RalphSteinhagen)</li>
</ul>
<h2><a class="anchor" id="autotoc_md3"></a>
v0.12.2</h2>
<ul>
<li>Much faster <code>for_each</code> and <code>(has|get)_(reader|writer)</code> <a href="https://github.com/veselink1/refl-cpp/commit/c197d35b09b1eeaca94f98b227fbea1562945195">c197d35</a> and <a href="https://github.com/veselink1/refl-cpp/issues/60">#60</a></li>
<li>Fixed <code>get_display_name_const</code> on MSVC <a href="https://github.com/veselink1/refl-cpp/issues/53">#53</a> (thanks @rpatters1)</li>
<li>Added CMake support <a href="https://github.com/veselink1/refl-cpp/issues/44">#44</a> (thanks @friendlyanon)</li>
<li>Moved header file to <a class="el" href="refl_8hpp.html">include/refl.hpp</a> <a href="https://github.com/veselink1/refl-cpp/issues/44">#44</a> (thanks @friendlyanon)</li>
<li>Fixed builds on on Apple, with xCode 12.3 and set(CMAKE_CXX_STANDARD 17) <a href="https://github.com/veselink1/refl-cpp/issues/43">#43</a> (thanks @michaelahughes)</li>
</ul>
<blockquote class="doxtable">
<p>NOTE: This version does not contain any breaking changes at the source level (as is clear by the patch version increment). However, this version adds CMake support and this required the <code><a class="el" href="refl_8hpp.html">refl.hpp</a></code> source file to be moved to a standard location <code><a class="el" href="refl_8hpp.html">include/refl.hpp</a></code>. If you are consuming refl-cpp as a single-header library, you can continue to do so. </p>
</blockquote>
<h2><a class="anchor" id="autotoc_md4"></a>
v0.12.1</h2>
<ul>
<li>Fixed broken build on Visual Studio 2017 <a href="https://github.com/veselink1/refl-cpp/issues/39">#39</a> (9b6aa1a)</li>
<li>Fixed out-of-bounds read in <code><a class="el" href="namespacerefl_1_1runtime.html#a06e1996b05966eac4f282b6656169d6a">refl::runtime::debug</a></code> implementation for <code>basic_string_view</code> (93351ac)</li>
<li>Fixed unused function warning for <code>refl::runtime::detail::next_depth</code> #36 (by <a href="https://github.com/oberrich">oberrich</a>)</li>
</ul>
<h2><a class="anchor" id="autotoc_md5"></a>
v0.12.0</h2>
<ul>
<li>Added <code>std::complex</code> support metadata. Disable with <code>REFL_NO_STD_COMPLEX</code>.</li>
<li>Added <code><a class="el" href="namespacerefl_1_1descriptor.html#a3690f579517cc28e9d2eacb3d095fdbb" title="Returns a member that has the same display name as the one provied and is readable.">refl::descriptor::get_reader</a></code>/<code>get_writer</code> utilities for getter/setter properties.</li>
<li>Added <code>refl::trait::index_of</code> for finding index of type in a <code>type_list</code>.</li>
<li>Added <code><a class="el" href="namespacerefl_1_1descriptor.html#a7cb65ca47183b468df2b8429dc5dea61" title="Returns the display name of T as a const_string&lt;N&gt;.">refl::descriptor::get_display_name_const</a></code> as <code>const_string</code> alternative to <code>get_display_name</code>.</li>
<li>Fixed #33 (by <a href="https://github.com/james-conrad">james-conrad</a>)</li>
</ul>
<h2><a class="anchor" id="autotoc_md6"></a>
v0.11.0</h2>
<ul>
<li>Much improved support for inheritance (<a href="https://github.com/veselink1/refl-cpp/issues/27">#27</a>, <a href="https://github.com/veselink1/refl-cpp/issues/28">#28</a>)<ul>
<li><code><a class="el" href="classrefl_1_1descriptor_1_1type__descriptor.html#a47c4ff48babd4b3c949a9f20fd4cfca2" title="The declared base types (via base_types&lt;Ts...&gt; attribute) of T.">refl::type_descriptor::declared_bases</a></code> lists base types declared via the <code>bases&lt;...&gt;</code> attribute</li>
<li><code><a class="el" href="classrefl_1_1descriptor_1_1type__descriptor.html#a49cb64fdc7142034426db38142cfa67b" title="The declared and inherited base types of T.">refl::type_descriptor::bases</a></code> lists base types declared via the <code>bases&lt;...&gt;</code> attribute as well as inherited members</li>
<li><code><a class="el" href="classrefl_1_1descriptor_1_1type__descriptor.html#a48f1fddd822d40866a30bf1ebd60fa1a" title="The list of declared and inherited member descriptors.">refl::type_descriptor::members</a></code> now includes declared and inherited members (when base types are specified via <code>bases&lt;...&gt;</code> attribute)</li>
<li><code><a class="el" href="classrefl_1_1descriptor_1_1type__descriptor.html#a49d984bc4bcb37717d3dc95a1815a4ba" title="The list of declared member descriptors.">refl::type_descriptor::declared_members</a></code> preserves the old behavior</li>
<li><code>refl::attr::bases&lt;...&gt;</code> types are now validated (via <code>std::is_base_of</code>)</li>
</ul>
</li>
<li>Added <code><a class="el" href="namespacerefl_1_1descriptor.html#a5621e8b981bfb910f027fb720320f977" title="Returns the unqualified name of the type, discarding the namespace and typenames (if a template type)...">refl::descriptor::get_simple_name</a></code>, which strips namespace and template declarations from the type name (<code>std::vector&lt;int&gt;</code> -&gt; <code>vector</code>)</li>
<li>Added free function equivalents of members of <code>_descriptor</code> types for symmetry purposes (and might allow for more optimal implementation in the future)</li>
<li>Added <code><a class="el" href="structrefl_1_1util_1_1const__string.html#a90d93009e7ae4bccec928c9342b197af" title="Searches the string for the first occurrence of the character and returns its position.">refl::const_string::find</a>/rfind</code> for searching chars in const_strings</li>
<li>Added <code>refl::make_const_string(char)</code> overload</li>
<li>Added <code>refl::type_list&lt;T&gt;</code> specialization which exposes <code>typedef T type</code> and a synonym <code>refl::type_tag&lt;T&gt;</code></li>
<li><code><a class="el" href="structrefl_1_1trait_1_1concat.html" title="Concatenates N lists together.">refl::trait::concat</a></code> now support an arbitrary number of <code>type_list</code>s as type arguments</li>
<li>Added <code>refl::trait::as_tuple</code> (similar to <code>as_type_list</code> but for <code>std::tuple</code>)</li>
<li>Added <code><a class="el" href="structrefl_1_1trait_1_1reverse.html" title="Reverses a list of types.">refl::trait::reverse</a></code></li>
<li>Added <code><a class="el" href="namespacerefl_1_1util.html#a7dfb7f94fdcfc69947d40143b3a07d65" title="Converts a type_list of types to a type_list of the type_descriptors for these types.">refl::util::reflect_types</a></code>/<code><a class="el" href="namespacerefl_1_1util.html#ad67a3c06ac31131661f1fb1cee670fbc" title="Converts a type_list of type_descriptors to a type_list of the target types.">refl::util::unreflect_types</a></code> to quickly create a list of <code>type_descriptor</code>s from a list of types and then back</li>
<li>Introduced support for different types of <code>std::basic_ostream</code> in <code>attr::debug</code> and <code>util::debug</code> (up to the user to take advantage of)</li>
<li>Built-in support for <code>std::string_view</code></li>
<li>More type assertions in <code>descriptor::</code> utilities</li>
<li>Simplification of some <code>trait::</code> types (should lead to better compile-times)</li>
<li>Made unit tests more comprehensive</li>
<li>Fixed incorrect <code><a class="el" href="namespacerefl_1_1util.html#aa9940e0488744c7466f3410f6acce07b" title="Returns the input paratemeter as-is.">refl::util::identity</a></code> implementation for rvalues</li>
<li>Fixed static function invocation with <code>operator()/invoke</code></li>
<li>Fixed <code>refl::util::debug</code> for <code>std::tuple</code> <a href="https://github.com/veselink1/refl-cpp/issues/26">#26</a></li>
<li>Deprecated <code><a class="el" href="namespacerefl_1_1descriptor.html#a725c882cfae058b70d50517fe134a938" title="Returns a list of the type_descriptor&lt;T&gt;s of the base types of the target, as specified by the bases&lt;...">refl::descriptor::get_bases</a></code> in favor of <code><a class="el" href="namespacerefl_1_1descriptor.html#afc445cfd9be739891c2b6731047cf144" title="Returns a type_list of the declared and inherited base types of the type.">refl::descriptor::get_base_types</a></code></li>
</ul>
<h2><a class="anchor" id="autotoc_md7"></a>
v0.10.0</h2>
<ul>
<li>Introduced automatic property name normalization in <code>get_display_name</code> for properties with no <code>friendly_name</code>. Example: <code>get_display_name(get_foo) -&gt; "foo"</code></li>
<li>Added built-in reflection support for <code>std::string_view</code> <a href="https://github.com/veselink1/refl-cpp/issues/23">#23</a></li>
<li>Fixed: operations on <code>type_list</code> do not properly take into account reference qualifiers</li>
<li>Fixed <code>const_string</code> constructor in older versions of clang</li>
<li>Fixed <code>util::filter</code> results list order (used to be reversed)</li>
<li>Fixed implementation of <code>reflect</code>, <code>is_reflectable</code>, <code>debug</code></li>
<li>Improved <code>runtime::debug</code> print formatting</li>
<li>Removed filtering by <code>const_string</code> utils <a href="https://github.com/veselink1/refl-cpp/issues/21">#21</a>. Suggested workaround: use predicate variants</li>
<li>Removed refl-ht support</li>
<li>Code cleanup <a href="https://github.com/veselink1/refl-cpp/issues/24">#24</a>, <a href="https://github.com/veselink1/refl-cpp/issues/20">#20</a></li>
</ul>
<h2><a class="anchor" id="autotoc_md8"></a>
v0.9.1</h2>
<ul>
<li>Bugfix for <code><a class="el" href="namespacerefl_1_1descriptor.html#a725c882cfae058b70d50517fe134a938" title="Returns a list of the type_descriptor&lt;T&gt;s of the base types of the target, as specified by the bases&lt;...">refl::descriptor::get_bases</a></code> for clang <a href="https://github.com/veselink1/refl-cpp/issues/19">#19</a></li>
</ul>
<h2><a class="anchor" id="autotoc_md9"></a>
v0.9.0</h2>
<ul>
<li>Introduced <code><a class="el" href="namespacerefl_1_1descriptor.html#a725c882cfae058b70d50517fe134a938" title="Returns a list of the type_descriptor&lt;T&gt;s of the base types of the target, as specified by the bases&lt;...">refl::descriptor::get_bases</a></code> (as well as <code><a class="el" href="namespacerefl_1_1descriptor.html#ac00126ab409dbc1a5445d37832876fe2" title="Checks if a type has a bases attribute.">refl::descriptor::has_bases</a></code>) to inspect a type's declared base types (see <a href="https://github.com/veselink1/refl-cpp/blob/master/examples/example-inheritance.cpp">example-inheritance.cpp</a>)</li>
<li>Bugfix for is_instance_of for template types with different arity <a href="https://github.com/veselink1/refl-cpp/issues/18">#18</a></li>
<li>Renamed <code>refl::descriptor::get_property_info</code> to <code><a class="el" href="namespacerefl_1_1descriptor.html#aadb1bb89c2469071ced6551ca3b9b8fd" title="Gets the property attribute.">refl::descriptor::get_property</a></code> to match the attribute name and its trait-based counterparts.</li>
<li>Discontinued <a href="https://github.com/veselink1/refl-ht">refl-ht</a> - the preprocessor for refl-cpp, due to unfixable bugs and lack of time/interest.</li>
</ul>
<h2><a class="anchor" id="autotoc_md10"></a>
v0.8.2</h2>
<ul>
<li>CV-qualifiers are now properly removed from attribute objects (previously, the values in the backing <code>std::tuple&lt;...&gt;</code> were sometimes cv-qualified).</li>
</ul>
<h2><a class="anchor" id="autotoc_md11"></a>
v0.8.1</h2>
<ul>
<li>Fixed a bug that prevented the compilation of <code><a class="el" href="namespacerefl_1_1descriptor.html#a9f021ce9c4ef95ab4313aefb8f4f3588" title="Returns the display name of T.">refl::descriptor::get_display_name()</a></code> in some compilers (thanks to <a href="https://github.com/ticelo">ticelo</a>)</li>
<li>Removed improper usage of <code>[[maybe_unused]]</code> that caused warnings under clang.</li>
</ul>
<h2><a class="anchor" id="autotoc_md12"></a>
v0.8.0</h2>
<ul>
<li>Added the ability to create <code>refl::const_string&lt;N&gt;</code> instances from <code>const char*</code> which allows using c-strings (<code>const char*</code>) values from attributes together with <code>const_string&lt;N&gt;</code> and in <code>constexpr</code> context possible. That feature is exposed by the <code><a class="el" href="refl_8hpp.html#a2cb939da062920a29a38dff73aaf0968" title="Converts a compile-time available const char* value to a const_string&lt;N&gt;.">REFL_MAKE_CONST_STRING(CString)</a></code> macro. Important: <code>CString</code> must be a <a href="https://en.cppreference.com/w/cpp/language/constant_expression#Core_constant_expressions">Core constant expression</a>. The macro is necessary to avoid the duplication of the provided expression and currently expands to ~ <code>detail::copy_from_unsized&lt;detail::strlen(CString)&gt;(CString)</code>. (another thanks to <a href="https://github.com/Siapran">Siapran</a> for contributing the implementation for the <code>constexpr length()</code> function.)</li>
</ul>
<h2><a class="anchor" id="autotoc_md13"></a>
v0.7.0</h2>
<ul>
<li>Added <code>constexpr const_string::substr&lt;Pos, [Count]&gt;()</code></li>
<li>Added <code><a class="el" href="namespacerefl_1_1util.html#a4902f2250ab00bb4884b348893fb7641" title="Creates an empty instance of const_string&lt;N&gt;">make_const_string()</a></code> as a shortcut for the creation of empty const strings.</li>
<li>Added <code>trait::{first, last, tail, init, append, prepend, reverse, concat}</code> and <code>TraitName_t</code> equivalents to ease the use of <code>type_list&lt;...&gt;</code>.</li>
<li>Breaking change: <code>trait::map</code> and <code>trait::filter</code> now no longer accept variadic template parameters. Wrap variadic parameters in a type_list. (Allowing both <code>type_list&lt;Ts...&gt;</code> and <code>Ts...</code> is problematic due to cryptic errors when e.g. <code>const type_list&lt;Ts...&gt;</code> is provided.)</li>
<li>Breaking change: <code>util::accumulate</code> now mimics the behaviour of <code>std::accumulate</code> more closely. It relies on the return value of the functor instead of mutating the accumulator argument. The new implementation now allows for the types of <code>initial_value</code> and the return type to differ (thanks to <a href="https://github.com/Siapran">Siapran</a>).</li>
<li>Removed: <code>util::get&lt;N&gt;(const type_list&lt;Ts...&gt;&amp;)</code>. Use <code>trait::get_t&lt;N, type_list&lt;Ts...&gt;&gt;</code> instead. This is part of a move towards minimizing the duplication between the <code>trait::</code> and <code>util::</code> namespaces.</li>
<li>Added two new examples: <a href="https://github.com/veselink1/refl-cpp/blob/master/examples/example-binding.cpp">example-binding.cpp</a> and <a href="https://github.com/veselink1/refl-cpp/blob/master/examples/example-dao.cpp">example-dao.cpp</a> to present some of the new things introduced in this release. (example-dao.cpp based on work by <a href="https://github.com/Siapran">Siapran</a>)</li>
</ul>
<h2><a class="anchor" id="autotoc_md14"></a>
v0.6.5</h2>
<ul>
<li>Fixed multiple unused X warnings (fixed by <a href="https://github.com/Siapran">Siapran</a>) #12</li>
</ul>
<h2><a class="anchor" id="autotoc_md15"></a>
v0.6.4</h2>
<ul>
<li>Bugfix: usage of incorrect bound in <code>operator+(const_string&lt;N&gt;, const_string&lt;M&gt;)</code> (fixed by <a href="https://github.com/Siapran">Siapran</a>) #11</li>
</ul>
<h2><a class="anchor" id="autotoc_md16"></a>
v0.6.3</h2>
<ul>
<li>Bugfix: clang errors during compilation of reflected overloaded member functions (since 0.6.0)</li>
</ul>
<h2><a class="anchor" id="autotoc_md17"></a>
v0.6.2</h2>
<ul>
<li>Bugfix: Compiler error in clang: <a class="el" href="structrefl_1_1attr_1_1property.html" title="Used to decorate a function that serves as a property.">refl::attr::property</a>'s implicitly-declared default constructor is deleted due to N3797 §8.5/7 <a href="https://github.com/veselink1/refl-cpp/issues/9">#9</a></li>
</ul>
<h2><a class="anchor" id="autotoc_md18"></a>
v0.6.1</h2>
<ul>
<li>Bugfix: const_string::operator std::string() was incorrectly marked as constexpr which caused compilation failure in non-C++20-compliant compilers</li>
</ul>
<h2><a class="anchor" id="autotoc_md19"></a>
v0.6.0</h2>
<ul>
<li>Changed: property() is now only usable on function members / use contract based checks for functions and fields (is_readable/writable)</li>
<li>Removed: read_only, write_only, read_write access modifiers for property() attributes (rw-detection now based on contract).</li>
</ul>
<h2><a class="anchor" id="autotoc_md20"></a>
v0.5.2</h2>
<ul>
<li>Added: <code>type_descriptor&lt;T&gt;::type</code> as an alias for <code>T</code>.</li>
<li>Added: <code>function_descriptor&lt;T, N&gt;::pointer</code> which points to the target function, if the pointer can be resolved and to nullptr otherwise.</li>
<li>Added: <code>function_descriptor&lt;T, N&gt;::is_resolved</code> for checking whether the pointer to the function has been resolved successfully.</li>
<li>Added: <code>function_descriptor&lt;T, N&gt;::resolve&lt;Pointer&gt;</code> for explicitly resolving the function pointer as a value of the specified type.</li>
<li>Added: <code>util::get&lt;size_t N&gt;(type_list&lt;Ts...&gt;&amp;&amp;)</code> which zero-initializes and returns the type at the N-th position.</li>
<li>Added: <code>util::get&lt;size_t N&gt;(Tuple&amp;&amp;)</code> as an alias for <code>std::get&lt;N&gt;</code>.</li>
</ul>
<h2><a class="anchor" id="autotoc_md21"></a>
v0.5.1</h2>
<ul>
<li>Bugfix: The REFL_AUTO macro was not working properly in MSVC and led to Internal compiler errors</li>
<li>Changed: As a result of the related bugfix, the REFL_AUTO macro has been stabilized and its use is now recommended</li>
</ul>
<h2><a class="anchor" id="autotoc_md22"></a>
v0.5.0</h2>
<ul>
<li>Removed deprecated macros <code>$refl(...)</code>, <code>REFL_UNSTABLE(...)</code>, <code>REFL_DEPRECATED(...)</code></li>
<li>Removed deprecated <code>refl::attr::access_type::read, write</code> constants. Replaced by read_only, write_only for consistency.</li>
<li>Removed deprecated <code>refl::attr::read_only, read_write, write_only</code> constants. Use the enum-qualified values. The constants are still available unqualified in macro context.</li>
<li>Removed refl::descriptor::make_invoker (which was not deprecated but is now obsolete.) Simply replace make_invoker(x) with x.</li>
<li>The defaulted constructor for <code><a class="el" href="structrefl_1_1util_1_1const__string.html" title="Represents a compile-time string.">refl::util::const_string</a>&lt;N&gt;</code> was replaced by a user-declared default constructor which now always zero-initializes the string buffer.</li>
</ul>
<h2><a class="anchor" id="autotoc_md23"></a>
v0.4.2</h2>
<ul>
<li>Added: <code>trait::is_type[_v]</code>, <code>descriptor::is_type(const T&amp;)</code> for checking whether a type is a type_descriptor&lt;T&gt; instance.</li>
</ul>
<h2><a class="anchor" id="autotoc_md24"></a>
v0.4.1</h2>
<ul>
<li><code>trait::as_type_list</code> now supports reference type in place of <code>T&lt;Ts...&gt;</code> (e.g. <code>std::tuple&lt;Ts...&gt;&amp;</code> -&gt; <code>type_list&lt;Ts...&gt;</code>).</li>
<li><code>refl::attr::access_type::{read, write}</code> now deprecated, replaced by <code>{read_only, write_only}</code> (Note: implicitly-usable <code>read_only</code>, <code>write_only</code> constants in attribute (in <code>REFL_...</code> macros) context remain unchanged)</li>
<li><code>refl::descriptor::field_descriptor::operator()</code> now supports acting as a setter. <code>refl::descriptor::make_invoker</code> is now no longer needed and marked as deprecated.</li>
</ul>
<h2><a class="anchor" id="autotoc_md25"></a>
v0.4.0</h2>
<ul>
<li>Renamed: <code>trait::filter</code> to <code>trait::filter_t</code>, replaced by <code>struct trait::filter { typedef ... type; }</code> to follow preset convention</li>
<li>Renamed: <code>trait::map</code> to <code>trait::map_t</code>, replaced by <code>struct trait::map { typedef ... type; }</code> to follow preset convention</li>
<li>Breaking change: <code>function_descriptor&lt;...&gt;::pointer</code> now no longer exists. (Reason: Replacing with forwarding function allows for more flexibility when using <code><a class="el" href="structrefl_1_1runtime_1_1proxy.html" title="A proxy object that has a static interface identical to the reflected functions and fields of the tar...">refl::runtime::proxy</a>&lt;&gt;</code>. Migrate by taking a pointer to <code>function_descriptor&lt;...&gt;<a class="el" href="namespacerefl_1_1descriptor.html#ab17264f6fe5ef2e6f10a67304cb40e83" title="Invokes the member with the specified arguments.">invoke()</a></code>)</li>
<li>Breaking change: trait::contains/base/instance now no longer work implicitly with <code>std::tuple&lt;...&gt;</code> or support variadic arguments. Use <code>type_list&lt;&gt;</code> or <code>trait::as_type_list_t</code> to migrate working code. (Reason: Specializations found to be causative to many recently discovered bugs and are error-prone.)</li>
<li>Bugfix: faulty implementation of <code>trait::skip&lt;N&gt;</code></li>
<li>Bugfix: faulty implementation of <code>util::to_tuple</code></li>
<li>Bugfix: <code>trait::contains_base</code> was working the other way around (checking for presense of base of a specified type, instead of checking for a derived type with a specified base)</li>
</ul>
<h2><a class="anchor" id="autotoc_md26"></a>
v0.3.5</h2>
<ul>
<li>Bugfix: <code>type_info__&lt;T*&gt;</code> has name defined as <code>char[N]</code> instead of <code>const_string&lt;N&gt;</code></li>
</ul>
<h2><a class="anchor" id="autotoc_md27"></a>
v0.3.4</h2>
<ul>
<li>added new experimental syntax for metadata declaration that makes use of variadic macro expansion (can be disabled with <code>REFL_NO_VARIADICS</code>) <div class="fragment"><div class="line">REFL_AUTO</div>
<div class="line">(</div>
<div class="line">    type(User), <span class="comment">// expands to REFL_TYPE(User)</span></div>
<div class="line">    field(<span class="keywordtype">id</span>, property(read_only)), <span class="comment">// expands to REFL_FIELD(id, property(read_only))</span></div>
<div class="line">    field(email),</div>
<div class="line">    field(first_name, property(<span class="stringliteral">&quot;firstName&quot;</span>)),</div>
<div class="line">    field(last_name, property(<span class="stringliteral">&quot;lastName&quot;</span>))</div>
<div class="line">    func(save_to_db) <span class="comment">// expands to REFL_FUNC(save_to_db)</span></div>
<div class="line">) <span class="comment">// REFL_END appended automatically</span></div>
</div><!-- fragment --></li>
</ul>
<h2><a class="anchor" id="autotoc_md28"></a>
v0.3.3</h2>
<ul>
<li><code><a class="el" href="structrefl_1_1util_1_1const__string.html" title="Represents a compile-time string.">refl::util::const_string</a>&lt;N&gt;</code> can now be directly compared for equality with <code>char[M]</code></li>
<li><code><a class="el" href="structrefl_1_1util_1_1const__string.html" title="Represents a compile-time string.">refl::util::const_string</a>&lt;N&gt;</code> can now be concatenated with <code>char[M]</code></li>
</ul>
<h2><a class="anchor" id="autotoc_md29"></a>
v0.3.2</h2>
<ul>
<li><code><a class="el" href="namespacerefl_1_1runtime.html#a06e1996b05966eac4f282b6656169d6a">refl::runtime::debug</a></code> now captures values of member invocations by universal references (previous implementations required a copy of the value)</li>
<li><code><a class="el" href="namespacerefl_1_1runtime.html#a06e1996b05966eac4f282b6656169d6a">refl::runtime::debug</a></code> now does not require the members of composites to be reflectable. (members that cannot be printed get replaced with <code>&lt;?&gt;</code>).</li>
<li><code><a class="el" href="structrefl_1_1trait_1_1is__reflectable.html" title="Checks whether there is reflection metadata for the type T.">refl::trait::is_reflectable</a></code> now discards cv-qualifiers -&gt; all cv-qualified types are now also reflectable.</li>
</ul>
<h2><a class="anchor" id="autotoc_md30"></a>
v0.3.1</h2>
<ul>
<li><code><a class="el" href="namespacerefl_1_1descriptor.html#a925e8cb99d6199fe03edeb5109958f8d" title="Checks if T is a 1-arg non-const-qualified member function with a property attribute or a non-const f...">refl::descriptor::is_writable</a></code> now correctly supports field descriptors</li>
<li>most of <code><a class="el" href="refl_8hpp.html">refl.hpp</a></code> is now not included when <code>REFL_PREPROCESSOR</code> is defined (optimization for refl-ht)</li>
</ul>
<h2><a class="anchor" id="autotoc_md31"></a>
v0.3.0</h2>
<ul>
<li>added new <code>REFL(...)</code> macro for annotation of reflectable members (replaces <code>$refl(...)</code>)</li>
<li><code>$refl(...)</code> macro usage now deprecated</li>
</ul>
<h2><a class="anchor" id="autotoc_md32"></a>
v0.2.1</h2>
<ul>
<li>added support for <a href="https://github.com/veselink1/refl-ht">refl-ht</a> (the refl-cpp header tool)</li>
</ul>
<h2><a class="anchor" id="autotoc_md33"></a>
v0.2.0</h2>
<ul>
<li>added <code><a class="el" href="namespacerefl_1_1util.html#a9b7d50e103a976d8b4baa9a4e6da67be" title="Returns true if any item in the list matches the predicate.">refl::util::contains</a>(type_list&lt;...&gt;, [predicate]), <a class="el" href="namespacerefl_1_1util.html#a9b7d50e103a976d8b4baa9a4e6da67be" title="Returns true if any item in the list matches the predicate.">refl::util::contains</a>(type_list&lt;...&gt;, const_string&lt;N&gt;)</code></li>
<li>removed <code>refl::attr::is_readable/is_writable</code> (use <code><a class="el" href="namespacerefl_1_1descriptor.html#aa68bedab33d684ee5ee4ead24c5586ab" title="Checks if T is a 0-arg const-qualified member function with a property attribute or a field.">refl::descriptor::is_readable</a>/is_writable</code> instead; reason: lack of support for fields that lack a property attribute)</li>
</ul>
<h2><a class="anchor" id="autotoc_md34"></a>
v0.1.2</h2>
<ul>
<li><code><a class="el" href="structrefl_1_1runtime_1_1proxy.html" title="A proxy object that has a static interface identical to the reflected functions and fields of the tar...">refl::runtime::proxy</a>&lt;Derived, Target&gt;</code> can now delegate field 'invocations'. (Methods with names matching those of the reflected fields are created.)</li>
<li><code><a class="el" href="structrefl_1_1attr_1_1property.html" title="Used to decorate a function that serves as a property.">refl::attr::property</a></code> now can take an optional <code>refl::attr::access_type</code> (values: <code>read_only</code>, <code>write_only</code>, <code>read_write</code>) to specify whether the property is considered readable or writable (or both).</li>
<li>added <code><a class="el" href="namespacerefl_1_1descriptor.html#aa68bedab33d684ee5ee4ead24c5586ab" title="Checks if T is a 0-arg const-qualified member function with a property attribute or a field.">refl::descriptor::is_readable</a>/is_writable</code></li>
<li>added <code>refl::attr::is_readable/is_writable</code> </li>
</ul>
</div></div><!-- contents -->
</div><!-- PageDoc -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
  </ul>
</div>
</body>
</html>
